//package main.scala.KNNalgorithm
//
//import org.apache.spark.rdd.RDD
//import org.apache.spark.sql.Row.unapplySeq
//import org.apache.spark.sql.catalyst.dsl.expressions.{DslExpression, StringToAttributeConversionHelper}
//import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
//
//import scala.collection.mutable.ArrayBuffer
//
//object MyKDtree {
//
//
//
//  def main(args: Array[String]): Unit = {
//
//
//
//
//    def genKDT( kdt:BinaryTree,  DFRM:DataFrame):Boolean ={
//
//
//      val df = DFRM.sort("_1").rdd.zipWithIndex()
//
//
//      false
//
//
//
//
//    }
//    /**
//     * Implementation of kd tree.
//     * 2021 9 9
//     * by Liu Minqiao
//     * Plan:
//     * 1 data space split
//     *  given a set of x called S, the median of S
//     *  lies in the Pth position which satisfy :
//     *    let len(S) = lens
//     *    if lens is odd：
//     *      P =  (lens+1)/2
//     *    else:
//     *      p = lens/2 + 1 (order is left to right, bottom to top)
//     */
//    val spark = SparkSession.builder()
//      .appName(this.getClass.getName)
//      .master("local[*]")
//      .getOrCreate()
//    val df: DataFrame = spark.createDataFrame(List(
//      (2,3),
//      (5,4),
//      (9,6),
//      (4,7),
//      (8,1),
//      (7,2)
//    ))
////    ds.sort($"col1", $"col2".desc)
//    var storage:Array[Double]=null
//    val value: RDD[(Row, Long)] = df.sort("_1").rdd.zipWithIndex()
//    val v2: RDD[(Double, Double, Long)] = value.map(x=>(x._1.get(0).toString.toDouble,x._1.get(1).toString.toDouble,x._2))
////    val v3 = v2.map(x=>(x._1.toString.toDouble,x._2.toString.to))
//    v2.foreach(x => println(x))
//    val df2 = spark.createDataFrame(v2).sort("_1")
//    df2.show()
////    val df2 = spark.createDataFrame(v2)
////    df2.show()
////      .toDF.show(truncate = false)
//
//    def addIndex(df: DataFrame,sortIndex:Int,Dim:Int): DataFrame = {
//
//      val value: RDD[(Row, Long)] = df.sort("_"+sortIndex.toString).rdd.zipWithIndex()
//      val v2 = value.map((x: (Row, Long)) => {
//
//        val p = x._1
//        p.getDouble(0)
//        val doubles: Seq[Double] = p.toSeq.map(x => x.toString.toDouble)
//        doubles.to
//        val arrayBuf = ArrayBuffer[Double]()
//        arrayBuf ++= x._1.toSeq.toArray.map(x=>x.toString.toDouble)
//        arrayBuf+=x._2
//        arrayBuf
//
//
////        val xy: (Double, Double, Long) =    (x._1.get(0).toString.toDouble, x._1.get(1).toString.toDouble, x._2)
////        (x._1.get(0).toString.toDouble, x._1.get(1).toString.toDouble, x._2)
//      })
//      //    val v3 = v2.map(x=>(x._1.toString.toDouble,x._2.toString.to))
////      v2.foreach(x => println(x))
//
//      val df2 = spark.createDataFrame(v2).sort("_"+sortIndex.toString)
//      df2
//    }
//
//  }
//
//
//}
//
